The purpose of exploratory analysis is to perform initial investigations on the data so as to discover patterns, identify any anomalies, to test initial hypothesis and check assumptions made at the start of the project.

In this section of the project we will ask two types of questions:

  1. what type of variation occurs within my variables?
  2. what type of covariation occurs between my variables?

Variation being the tendency for values of a variable to change from measurement to measurement, and covariance is the tendency for two or more variables to vary together in a related way.

pacman::p_load(
  tidyverse,
  here,
  RColorBrewer,
  lubridate,
  scales,
  GGally,
  stats,
  corrplot,
  mice,
  VIM
)
flights_dt <- read_csv(here("clean_data/flights_clean.csv"))
Rows: 327346 Columns: 38
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (11): origin, origin_name, dest, dest_name, carrier, carrier_name, tailnum, manufacturer, model, engine, type
dbl  (22): dep_delay, arr_delay, air_time, distance, flight, engines, seats, aircraft_age, lat, lon, alt, wind_di...
dttm  (5): dep_time, sched_dep_time, arr_time, sched_arr_time, time_hour

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

Which airport in our dataset has the highest number of departures?

flights_dt %>% 
  group_by(origin) %>%
  ggplot() +
  aes(x = origin, fill = origin) +
  geom_bar() +
  scale_fill_manual(values = cbPalette) +
  labs(
    x = "airport",
    y = "departure numbers",
    title = "Departure numbers by airport"
  ) +
  guides(fill = "none") +
  theme_bw()

What is the trend of delays over the year, how does it compare across the three airports?

flights_dt %>% 
  filter(dep_delay > 0) %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = mean_delay, colour = origin) +
  geom_line(alpha = 0.6) +
  geom_point(alpha = 0.8) +
  labs(
    x = "month",
    y = "mean delay (minutes)",
    title = " Mean delay by month",
    colour = "airport"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

What is the number of departure delays over the year?

flights_dt %>%
  filter(dep_delay > 0) %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(no_of_delays = n(), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = no_of_delays, colour = origin) +
  geom_line(alpha = 0.6) +
  geom_point(alpha = 0.8) +
  labs(
    x = "month",
    y = "number of delays",
    title = " Monthly trend of departure delays",
    colour = "airport"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

What is the number of flights per month?

flights_dt %>%
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(no_of_flights = n(), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = no_of_flights, fill = origin) +
  geom_col(position = "dodge", alpha = 0.8) +
  labs(
    x = "month",
    y = "number of departures",
    title = "Departure numbers by month",
    fill = "airport"
  ) +
  scale_fill_manual(values = cbPalette) +
  theme_bw()

Which carrier has the most departure delays?

flights_dt %>% 
  filter(dep_delay > 0) %>% 
  group_by(carrier_name, origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
  geom_col(alpha = 0.8) +
  facet_wrap(~ origin) +
  labs(
    x = "carrier",
    y = "mean delay (minutes)",
    title = "Mean departure delay by carrier",
    fill = "airport"
  ) +
  theme_bw() +
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
  theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
  coord_flip()

Which carrier has the most arrival delays?

flights_dt %>% 
  filter(arr_delay > 0) %>% 
  group_by(carrier_name, origin) %>% 
  summarise(mean_delay = mean(arr_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
  geom_col(alpha = 0.8) +
  facet_wrap(~ origin) +
  labs(
    x = "carrier",
    y = "mean delay (minutes)",
    title = "Mean arrival delay by carrier",
    fill = "airport"
  ) +
  theme_bw() +
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
  theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
  coord_flip()

Which season has the highest number of departure delays?

flights_dt %>% 
  filter(dep_delay > 0) %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  ggplot() +
  aes(x = day, y = mean_delay, colour = origin) +
  geom_point(alpha = 0.8) +
  labs(
    x = "date",
    y = "mean delay (minutes)",
    title = "Mean departure delay by month"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

Over the course of a day when is the largest average delay?

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  select(dep_delay, hour) %>%
  group_by(hour) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  ggplot() +
  aes(x = hour, y = mean_delay) +
  geom_point(alpha = 0.8) +
  geom_smooth(se = FALSE) +
  labs(
    x = "hour",
    y = "mean delay (minutes)",
    title = "Mean departure delay by departure time"
  ) +
  theme_bw() +
  scale_x_continuous(limits = c(5, 23), breaks = seq(5, 23, by = 1))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

Which destinations suffer from the longest delays?

flights_dt %>%
  drop_na(dest_name) %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(dest, dest_name) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  arrange(desc(mean_delay)) %>% 
  head(10) %>% 
  ggplot() +
  aes(x = reorder(dest_name, mean_delay), y = mean_delay) +
  geom_col(fill = "#999999", alpha = 0.8) +
  labs(
    x = "destination",
    y = "mean delay (minutes)",
    title = "Destinations with longest delays"
  ) +
  theme_bw() +
  coord_flip()

Trend weather conditions against mean departure delays

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_visibility = mean(visib, na.rm = TRUE),
            mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = mean_visibility, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean visibility (miles)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by visibility"
  ) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_wind_speed = mean(wind_speed, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_wind_speed, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean wind speed (mph)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by wind speed"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_wind_dir = mean(wind_dir, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_wind_dir, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean wind direction (degrees)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by wind direction"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_humidity = mean(humid, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_humidity, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean humidity (%)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by humidity"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_temp = mean(temp, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_temp, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean temperature (degf)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by temperature"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_dewpoint = mean(dewp, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_dewpoint, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean dewpoint (degF)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by dewpoint"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_precip = mean(precip, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_precip, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean precipitation (inches)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by precipitation"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
  filter(dep_delay > 0 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_pressure = mean(pressure, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_pressure, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    x = "mean pressure (mbar)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by pressure"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

Corrplot

# subset the flights dataset so as to drop NAs, filter on only departure delays (no early departures) and only for Newark Int.
flights_weather <- flights_dt %>% 
  na.omit() %>% 
  filter(dep_delay > 0 & origin == "EWR") %>% 
  select(dep_delay, temp, dewp, humid, wind_dir, wind_speed, precip, pressure, visib)

# create correlation matrix
cor_matrix <- cor(flights_weather)
corrplot(cor_matrix, type = "upper", col = cbPalette,
         tl.col = "black", method = "number")

ggpairs

ggpairs(flights_weather)

 plot: [1,1] [>--------------------------------------------------------------------------------------]  1% est: 0s 
 plot: [1,2] [=>-------------------------------------------------------------------------------------]  2% est: 1s 
 plot: [1,3] [==>------------------------------------------------------------------------------------]  4% est: 2s 
 plot: [1,4] [===>-----------------------------------------------------------------------------------]  5% est: 2s 
 plot: [1,5] [====>----------------------------------------------------------------------------------]  6% est: 2s 
 plot: [1,6] [=====>---------------------------------------------------------------------------------]  7% est: 2s 
 plot: [1,7] [=======>-------------------------------------------------------------------------------]  9% est: 2s 
 plot: [1,8] [========>------------------------------------------------------------------------------] 10% est: 2s 
 plot: [1,9] [=========>-----------------------------------------------------------------------------] 11% est: 2s 
 plot: [2,1] [==========>----------------------------------------------------------------------------] 12% est: 2s 
 plot: [2,2] [===========>---------------------------------------------------------------------------] 14% est: 2s 
 plot: [2,3] [============>--------------------------------------------------------------------------] 15% est: 2s 
 plot: [2,4] [=============>-------------------------------------------------------------------------] 16% est: 2s 
 plot: [2,5] [==============>------------------------------------------------------------------------] 17% est: 2s 
 plot: [2,6] [===============>-----------------------------------------------------------------------] 19% est: 2s 
 plot: [2,7] [================>----------------------------------------------------------------------] 20% est: 2s 
 plot: [2,8] [=================>---------------------------------------------------------------------] 21% est: 2s 
 plot: [2,9] [==================>--------------------------------------------------------------------] 22% est: 2s 
 plot: [3,1] [===================>-------------------------------------------------------------------] 23% est: 2s 
 plot: [3,2] [====================>------------------------------------------------------------------] 25% est: 2s 
 plot: [3,3] [======================>----------------------------------------------------------------] 26% est: 2s 
 plot: [3,4] [=======================>---------------------------------------------------------------] 27% est: 2s 
 plot: [3,5] [========================>--------------------------------------------------------------] 28% est: 2s 
 plot: [3,6] [=========================>-------------------------------------------------------------] 30% est: 2s 
 plot: [3,7] [==========================>------------------------------------------------------------] 31% est: 2s 
 plot: [3,8] [===========================>-----------------------------------------------------------] 32% est: 2s 
 plot: [3,9] [============================>----------------------------------------------------------] 33% est: 2s 
 plot: [4,1] [=============================>---------------------------------------------------------] 35% est: 2s 
 plot: [4,2] [==============================>--------------------------------------------------------] 36% est: 2s 
 plot: [4,3] [===============================>-------------------------------------------------------] 37% est: 2s 
 plot: [4,4] [================================>------------------------------------------------------] 38% est: 2s 
 plot: [4,5] [=================================>-----------------------------------------------------] 40% est: 2s 
 plot: [4,6] [==================================>----------------------------------------------------] 41% est: 2s 
 plot: [4,7] [====================================>--------------------------------------------------] 42% est: 2s 
 plot: [4,8] [=====================================>-------------------------------------------------] 43% est: 2s 
 plot: [4,9] [======================================>------------------------------------------------] 44% est: 2s 
 plot: [5,1] [=======================================>-----------------------------------------------] 46% est: 1s 
 plot: [5,2] [========================================>----------------------------------------------] 47% est: 1s 
 plot: [5,3] [=========================================>---------------------------------------------] 48% est: 1s 
 plot: [5,4] [==========================================>--------------------------------------------] 49% est: 1s 
 plot: [5,5] [===========================================>-------------------------------------------] 51% est: 1s 
 plot: [5,6] [============================================>------------------------------------------] 52% est: 1s 
 plot: [5,7] [=============================================>-----------------------------------------] 53% est: 1s 
 plot: [5,8] [==============================================>----------------------------------------] 54% est: 1s 
 plot: [5,9] [===============================================>---------------------------------------] 56% est: 1s 
 plot: [6,1] [================================================>--------------------------------------] 57% est: 1s 
 plot: [6,2] [=================================================>-------------------------------------] 58% est: 1s 
 plot: [6,3] [===================================================>-----------------------------------] 59% est: 1s 
 plot: [6,4] [====================================================>----------------------------------] 60% est: 1s 
 plot: [6,5] [=====================================================>---------------------------------] 62% est: 1s 
 plot: [6,6] [======================================================>--------------------------------] 63% est: 1s 
 plot: [6,7] [=======================================================>-------------------------------] 64% est: 1s 
 plot: [6,8] [========================================================>------------------------------] 65% est: 1s 
 plot: [6,9] [=========================================================>-----------------------------] 67% est: 1s 
 plot: [7,1] [==========================================================>----------------------------] 68% est: 1s 
 plot: [7,2] [===========================================================>---------------------------] 69% est: 1s 
 plot: [7,3] [============================================================>--------------------------] 70% est: 1s 
 plot: [7,4] [=============================================================>-------------------------] 72% est: 1s 
 plot: [7,5] [==============================================================>------------------------] 73% est: 1s 
 plot: [7,6] [===============================================================>-----------------------] 74% est: 1s 
 plot: [7,7] [=================================================================>---------------------] 75% est: 1s 
 plot: [7,8] [==================================================================>--------------------] 77% est: 1s 
 plot: [7,9] [===================================================================>-------------------] 78% est: 1s 
 plot: [8,1] [====================================================================>------------------] 79% est: 1s 
 plot: [8,2] [=====================================================================>-----------------] 80% est: 1s 
 plot: [8,3] [======================================================================>----------------] 81% est: 1s 
 plot: [8,4] [=======================================================================>---------------] 83% est: 0s 
 plot: [8,5] [========================================================================>--------------] 84% est: 0s 
 plot: [8,6] [=========================================================================>-------------] 85% est: 0s 
 plot: [8,7] [==========================================================================>------------] 86% est: 0s 
 plot: [8,8] [===========================================================================>-----------] 88% est: 0s 
 plot: [8,9] [============================================================================>----------] 89% est: 0s 
 plot: [9,1] [=============================================================================>---------] 90% est: 0s 
 plot: [9,2] [==============================================================================>--------] 91% est: 0s 
 plot: [9,3] [================================================================================>------] 93% est: 0s 
 plot: [9,4] [=================================================================================>-----] 94% est: 0s 
 plot: [9,5] [==================================================================================>----] 95% est: 0s 
 plot: [9,6] [===================================================================================>---] 96% est: 0s 
 plot: [9,7] [====================================================================================>--] 98% est: 0s 
 plot: [9,8] [=====================================================================================>-] 99% est: 0s 
 plot: [9,9] [=======================================================================================]100% est: 0s 
                                                                                                                   

Subset flights

flights_numerical_all <- flights_dt %>%
  filter(dep_delay > 0 & origin == "EWR") %>% 
  na.omit() %>% 
  select_if(., is.numeric) %>%  # select all numeric variables
  select(-arr_delay)
  
flights_numerical_all

Simple linear regression

# build a simple linear regression model using dep_delay and the weather variables
model <- lm(dep_delay ~ ., data = flights_weather)

# view results 
summary(model)

Call:
lm(formula = dep_delay ~ ., data = flights_weather)

Residuals:
   Min     1Q Median     3Q    Max 
-59.90 -29.00 -16.77  10.88 815.29 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 631.659739  40.355182  15.653  < 2e-16 ***
temp          0.463713   0.135562   3.421 0.000625 ***
dewp         -0.435947   0.145838  -2.989 0.002798 ** 
humid         0.467200   0.076075   6.141 8.26e-10 ***
wind_dir     -0.017681   0.002832  -6.243 4.33e-10 ***
wind_speed    0.486040   0.054098   8.985  < 2e-16 ***
precip       -8.181936  17.295980  -0.473 0.636177    
pressure     -0.623965   0.038058 -16.395  < 2e-16 ***
visib         0.297599   0.213728   1.392 0.163802    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 48.57 on 40553 degrees of freedom
Multiple R-squared:  0.025, Adjusted R-squared:  0.02481 
F-statistic:   130 on 8 and 40553 DF,  p-value: < 2.2e-16
model <- lm(dep_delay ~ ., data = flights_numerical_all)
summary(model)

Call:
lm(formula = dep_delay ~ ., data = flights_numerical_all)

Residuals:
   Min     1Q Median     3Q    Max 
-72.72 -27.16 -13.85   9.58 814.57 

Coefficients: (1 not defined because of singularities)
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.509e+02  4.220e+01  10.683  < 2e-16 ***
air_time     -6.738e-02  1.961e-02  -3.437 0.000589 ***
distance     -1.711e-03  3.154e-03  -0.542 0.587581    
flight        1.037e-03  2.755e-04   3.764 0.000167 ***
engines      -1.625e+00  6.519e+00  -0.249 0.803125    
seats        -6.355e-02  7.564e-03  -8.402  < 2e-16 ***
aircraft_age  2.627e-01  4.894e-02   5.368 8.03e-08 ***
lat          -9.124e-02  7.672e-02  -1.189 0.234325    
lon          -4.013e-01  1.065e-01  -3.767 0.000165 ***
alt           4.754e-04  2.472e-04   1.923 0.054510 .  
wind_dir     -1.445e-02  2.764e-03  -5.227 1.73e-07 ***
humid         6.034e-01  7.430e-02   8.121 4.75e-16 ***
hour          1.754e+00  5.545e-02  31.635  < 2e-16 ***
minute       -1.034e-02  1.309e-02  -0.790 0.429545    
year                 NA         NA      NA       NA    
temp          5.248e-01  1.323e-01   3.967 7.29e-05 ***
dewp         -5.353e-01  1.423e-01  -3.762 0.000169 ***
wind_speed    4.901e-01  5.279e-02   9.283  < 2e-16 ***
precip       -1.904e+01  1.688e+01  -1.128 0.259325    
pressure     -4.965e-01  3.751e-02 -13.237  < 2e-16 ***
visib         4.131e-01  2.086e-01   1.980 0.047704 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 47.37 on 40542 degrees of freedom
Multiple R-squared:  0.07253,   Adjusted R-squared:  0.07209 
F-statistic: 166.9 on 19 and 40542 DF,  p-value: < 2.2e-16

glmulti

glmulti_fit <- glmulti(
  dep_delay ~ ., 
  data = flights_weather,
  level = 2, # 2 = include pairwise interactions, 1 = main effects only (main effect = no pairwise interactions)
  minsize = 0, # no min size of model
  maxsize = -1, # -1 = no max size of model
  marginality = TRUE, # marginality here means the same as 'strongly hierarchical' interactions, i.e. include pairwise interactions only if both predictors present in the model as main effects.
  method = "g", # the problem is too large for exhaustive search, so search using a genetic algorithm
  crit = bic, # criteria for model selection is BIC value (lower is better)
  plotty = FALSE, # don't plot models as function runs
  report = TRUE, # do produce reports as function runs
  confsetsize = 10, # return best 100 solutions
  fitfunction = lm # fit using the `lm` function
)
LS0tCnRpdGxlOiAiRmxpZ2h0cyBFeHBsb3JhdG9yeSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhlIHB1cnBvc2Ugb2YgZXhwbG9yYXRvcnkgYW5hbHlzaXMgaXMgdG8gcGVyZm9ybSBpbml0aWFsIGludmVzdGlnYXRpb25zIG9uIHRoZSBkYXRhIHNvIGFzIHRvIGRpc2NvdmVyIHBhdHRlcm5zLCBpZGVudGlmeSBhbnkgYW5vbWFsaWVzLCB0byB0ZXN0IGluaXRpYWwgaHlwb3RoZXNpcyBhbmQgY2hlY2sgYXNzdW1wdGlvbnMgbWFkZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2plY3QuIAoKSW4gdGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IHdlIHdpbGwgYXNrIHR3byB0eXBlcyBvZiBxdWVzdGlvbnM6IAoKMS4gd2hhdCB0eXBlIG9mIHZhcmlhdGlvbiBvY2N1cnMgd2l0aGluIG15IHZhcmlhYmxlcz8gCjIuIHdoYXQgdHlwZSBvZiBjb3ZhcmlhdGlvbiBvY2N1cnMgYmV0d2VlbiBteSB2YXJpYWJsZXM/IAoKVmFyaWF0aW9uIGJlaW5nIHRoZSB0ZW5kZW5jeSBmb3IgdmFsdWVzIG9mIGEgdmFyaWFibGUgdG8gY2hhbmdlIGZyb20gbWVhc3VyZW1lbnQgdG8gbWVhc3VyZW1lbnQsIGFuZCBjb3ZhcmlhbmNlIGlzIHRoZSB0ZW5kZW5jeSBmb3IgdHdvIG9yIG1vcmUgdmFyaWFibGVzIHRvIHZhcnkgdG9nZXRoZXIgaW4gYSByZWxhdGVkIHdheS4KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CnBhY21hbjo6cF9sb2FkKAogIHRpZHl2ZXJzZSwKICBoZXJlLAogIFJDb2xvckJyZXdlciwKICBsdWJyaWRhdGUsCiAgc2NhbGVzLAogIEdHYWxseSwKICBzdGF0cywKICBjb3JycGxvdCwKICBsZWFwcywKICBnbG11bHRpLAogIGJyb29tCikKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpmbGlnaHRzX2R0IDwtIHJlYWRfY3N2KGhlcmUoImNsZWFuX2RhdGEvZmxpZ2h0c19jbGVhbi5jc3YiKSkKCmNiUGFsZXR0ZSA8LSBjKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIsICIjMDA5RTczIiwgIiNGMEU0NDIiLCAiIzAwNzJCMiIsICIjRDU1RTAwIiwgIiNDQzc5QTciKQpgYGAKCiMgV2hpY2ggYWlycG9ydCBpbiBvdXIgZGF0YXNldCBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZ3JvdXBfYnkob3JpZ2luKSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBvcmlnaW4sIGZpbGwgPSBvcmlnaW4pICsKICBnZW9tX2JhcigpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBsYWJzKAogICAgeCA9ICJhaXJwb3J0IiwKICAgIHkgPSAiZGVwYXJ0dXJlIG51bWJlcnMiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIG51bWJlcnMgYnkgYWlycG9ydCIKICApICsKICBndWlkZXMoZmlsbCA9ICJub25lIikgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoYXQgaXMgdGhlIHRyZW5kIG9mIGRlbGF5cyBvdmVyIHRoZSB5ZWFyLCBob3cgZG9lcyBpdCBjb21wYXJlIGFjcm9zcyB0aGUgdGhyZWUgYWlycG9ydHM/CgpgYGB7cix3YXJuaW5nPUZBTFNFfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KG1vbnRoID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgIm1vbnRoIiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBtZWFuX2RlbGF5LCBjb2xvdXIgPSBvcmlnaW4pICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjYpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44KSArCiAgbGFicygKICAgIHggPSAibW9udGgiLAogICAgeSA9ICJtZWFuIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICIgTWVhbiBkZWxheSBieSBtb250aCIsCiAgICBjb2xvdXIgPSAiYWlycG9ydCIKICApICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IikpICsKICB0aGVtZV9idygpCmBgYAoKIyBXaGF0IGlzIHRoZSBudW1iZXIgb2YgZGVwYXJ0dXJlIGRlbGF5cyBvdmVyIHRoZSB5ZWFyPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+IDApICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2Uobm9fb2ZfZGVsYXlzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9kZWxheXMsIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fbGluZShhbHBoYSA9IDAuNikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJtb250aCIsCiAgICB5ID0gIm51bWJlciBvZiBkZWxheXMiLAogICAgdGl0bGUgPSAiIE1vbnRobHkgdHJlbmQgb2YgZGVwYXJ0dXJlIGRlbGF5cyIsCiAgICBjb2xvdXIgPSAiYWlycG9ydCIKICApICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IikpICsKICB0aGVtZV9idygpCmBgYAoKIyBXaGF0IGlzIHRoZSBudW1iZXIgb2YgZmxpZ2h0cyBwZXIgbW9udGg/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2Uobm9fb2ZfZmxpZ2h0cyA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1vbnRoLCB5ID0gbm9fb2ZfZmxpZ2h0cywgZmlsbCA9IG9yaWdpbikgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJtb250aCIsCiAgICB5ID0gIm51bWJlciBvZiBkZXBhcnR1cmVzIiwKICAgIHRpdGxlID0gIkRlcGFydHVyZSBudW1iZXJzIGJ5IG1vbnRoIiwKICAgIGZpbGwgPSAiYWlycG9ydCIKICApICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICB0aGVtZV9idygpCmBgYAoKIyBXaGljaCBjYXJyaWVyIGhhcyB0aGUgbW9zdCBkZXBhcnR1cmUgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwKSAlPiUgCiAgZ3JvdXBfYnkoY2Fycmllcl9uYW1lLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IHJlb3JkZXIoY2Fycmllcl9uYW1lLCBtZWFuX2RlbGF5KSwgeSA9IG1lYW5fZGVsYXksIGZpbGwgPSBvcmlnaW4pICsKICBnZW9tX2NvbChhbHBoYSA9IDAuOCkgKwogIGZhY2V0X3dyYXAofiBvcmlnaW4pICsKICBsYWJzKAogICAgeCA9ICJjYXJyaWVyIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgY2FycmllciIsCiAgICBmaWxsID0gImFpcnBvcnQiCiAgKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBXaGljaCBjYXJyaWVyIGhhcyB0aGUgbW9zdCBhcnJpdmFsIGRlbGF5cz8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoYXJyX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXJfbmFtZSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGFycl9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGNhcnJpZXJfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5LCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAwLjgpICsKICBmYWNldF93cmFwKH4gb3JpZ2luKSArCiAgbGFicygKICAgIHggPSAiY2FycmllciIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gYXJyaXZhbCBkZWxheSBieSBjYXJyaWVyIiwKICAgIGZpbGwgPSAiYWlycG9ydCIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIFdoaWNoIHNlYXNvbiBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDApICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkYXksIHkgPSBtZWFuX2RlbGF5LCBjb2xvdXIgPSBvcmlnaW4pICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44KSArCiAgbGFicygKICAgIHggPSAiZGF0ZSIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IG1vbnRoIgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIE92ZXIgdGhlIGNvdXJzZSBvZiBhIGRheSB3aGVuIGlzIHRoZSBsYXJnZXN0IGF2ZXJhZ2UgZGVsYXk/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBzZWxlY3QoZGVwX2RlbGF5LCBob3VyKSAlPiUKICBncm91cF9ieShob3VyKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGhvdXIsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICBsYWJzKAogICAgeCA9ICJob3VyIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgZGVwYXJ0dXJlIHRpbWUiCiAgKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoNSwgMjMpLCBicmVha3MgPSBzZXEoNSwgMjMsIGJ5ID0gMSkpCmBgYAojIFdoaWNoIGFyZSB0aGUgbW9zdCBwb3B1bGFyIGRlc3RpbmF0aW9ucyBmcm9tIE5ld2FyayBJbnQ/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRlc3QsIGRlc3RfbmFtZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSAKICBoZWFkKDEwKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gcmVvcmRlcihkZXN0X25hbWUsIGNvdW50KSwgeSA9IGNvdW50KSArCiAgZ2VvbV9jb2woZmlsbCA9ICIjOTk5OTk5IiwgYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkZXN0aW5hdGlvbiIsCiAgICB5ID0gIm51bWJlciBvZiBmbGlnaHRzIHBlciB5ZWFyIiwKICAgIHRpdGxlID0gIkRlc3RpbmF0aW9ucyBmcm9tIE5ld2FyayBJbnQuIgogICkgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgV2hpY2ggZGVzdGluYXRpb25zIHN1ZmZlciBmcm9tIHRoZSBsb25nZXN0IGRlbGF5cz8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGRyb3BfbmEoZGVzdF9uYW1lKSAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkZXN0LCBkZXN0X25hbWUpICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgYXJyYW5nZShkZXNjKG1lYW5fZGVsYXkpKSAlPiUgCiAgaGVhZCgxMCkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IHJlb3JkZXIoZGVzdF9uYW1lLCBtZWFuX2RlbGF5KSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRlc3RpbmF0aW9uIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVzdGluYXRpb25zIHdpdGggbG9uZ2VzdCBkZWxheXMiCiAgKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBUcmVuZCB3ZWF0aGVyIGNvbmRpdGlvbnMgYWdhaW5zdCBtZWFuIGRlcGFydHVyZSBkZWxheXMKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fdmlzaWJpbGl0eSA9IG1lYW4odmlzaWIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3Zpc2liaWxpdHksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHZpc2liaWxpdHkgKG1pbGVzKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSB2aXNpYmlsaXR5IgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3dpbmRfc3BlZWQgPSBtZWFuKHdpbmRfc3BlZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3dpbmRfc3BlZWQsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHdpbmQgc3BlZWQgKG1waCkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgd2luZCBzcGVlZCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl93aW5kX2RpciA9IG1lYW4od2luZF9kaXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3dpbmRfZGlyLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicygKICAgIHggPSAibWVhbiB3aW5kIGRpcmVjdGlvbiAoZGVncmVlcykiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgd2luZCBkaXJlY3Rpb24iCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9odW1pZGl0eSA9IG1lYW4oaHVtaWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX2h1bWlkaXR5LCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicygKICAgIHggPSAibWVhbiBodW1pZGl0eSAoJSkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgaHVtaWRpdHkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fdGVtcCA9IG1lYW4odGVtcCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5fdGVtcCwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdGVtcGVyYXR1cmUgKGRlZ2YpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHRlbXBlcmF0dXJlIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2Rld3BvaW50ID0gbWVhbihkZXdwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl9kZXdwb2ludCwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gZGV3cG9pbnQgKGRlZ0YpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IGRld3BvaW50IgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3ByZWNpcCA9IG1lYW4ocHJlY2lwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl9wcmVjaXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHByZWNpcGl0YXRpb24gKGluY2hlcykiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgcHJlY2lwaXRhdGlvbiIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3ByZXNzdXJlID0gbWVhbihwcmVzc3VyZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5fcHJlc3N1cmUsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHByZXNzdXJlIChtYmFyKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVzc3VyZSIKICApICsKICB0aGVtZV9idygpCmBgYAoKIyBDb3JycGxvdAoKYGBge3J9CiMgc3Vic2V0IHRoZSBmbGlnaHRzIGRhdGFzZXQgc28gYXMgdG8gZHJvcCBOQXMsIGZpbHRlciBvbiBvbmx5IGRlcGFydHVyZSBkZWxheXMgKG5vIGVhcmx5IGRlcGFydHVyZXMpIGFuZCBvbmx5IGZvciBOZXdhcmsgSW50LgpmbGlnaHRzX3dlYXRoZXIgPC0gZmxpZ2h0c19kdCAlPiUgCiAgbmEub21pdCgpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIHNlbGVjdChkZXBfZGVsYXksIHRlbXAsIGRld3AsIGh1bWlkLCB3aW5kX2Rpciwgd2luZF9zcGVlZCwgcHJlY2lwLCBwcmVzc3VyZSwgdmlzaWIpCgojIGNyZWF0ZSBjb3JyZWxhdGlvbiBtYXRyaXgKY29yX21hdHJpeCA8LSBjb3IoZmxpZ2h0c193ZWF0aGVyKQpjb3JycGxvdChjb3JfbWF0cml4LCB0eXBlID0gInVwcGVyIiwgY29sID0gY2JQYWxldHRlLAogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCBtZXRob2QgPSAibnVtYmVyIikKYGBgCgojIGdncGFpcnMKCmBgYHtyfQpnZ3BhaXJzKGZsaWdodHNfd2VhdGhlcikKYGBgCgojIFN1YnNldCBmbGlnaHRzCgpgYGB7cn0KZmxpZ2h0c19udW1lcmljYWxfYWxsIDwtIGZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIHNlbGVjdF9pZiguLCBpcy5udW1lcmljKSAlPiUgICMgc2VsZWN0IGFsbCBudW1lcmljIHZhcmlhYmxlcwogIHNlbGVjdCgtYXJyX2RlbGF5KQogIApmbGlnaHRzX251bWVyaWNhbF9hbGwKYGBgCgojIFNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbgoKYGBge3J9CiMgYnVpbGQgYSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgdXNpbmcgZGVwX2RlbGF5IGFuZCB0aGUgd2VhdGhlciB2YXJpYWJsZXMKbW9kZWwgPC0gbG0oZGVwX2RlbGF5IH4gLiwgZGF0YSA9IGZsaWdodHNfd2VhdGhlcikKCiMgdmlldyByZXN1bHRzIApzdW1tYXJ5KG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShkZXBfZGVsYXkgfiAuLCBkYXRhID0gZmxpZ2h0c19udW1lcmljYWxfYWxsKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCiMgZ2xtdWx0aQoKYGBge3J9CmdsbXVsdGlfZml0IDwtIGdsbXVsdGkoCiAgZGVwX2RlbGF5IH4gLiwgCiAgZGF0YSA9IGZsaWdodHNfd2VhdGhlciwKICBsZXZlbCA9IDIsICMgMiA9IGluY2x1ZGUgcGFpcndpc2UgaW50ZXJhY3Rpb25zLCAxID0gbWFpbiBlZmZlY3RzIG9ubHkgKG1haW4gZWZmZWN0ID0gbm8gcGFpcndpc2UgaW50ZXJhY3Rpb25zKQogIG1pbnNpemUgPSAwLCAjIG5vIG1pbiBzaXplIG9mIG1vZGVsCiAgbWF4c2l6ZSA9IC0xLCAjIC0xID0gbm8gbWF4IHNpemUgb2YgbW9kZWwKICBtYXJnaW5hbGl0eSA9IFRSVUUsICMgbWFyZ2luYWxpdHkgaGVyZSBtZWFucyB0aGUgc2FtZSBhcyAnc3Ryb25nbHkgaGllcmFyY2hpY2FsJyBpbnRlcmFjdGlvbnMsIGkuZS4gaW5jbHVkZSBwYWlyd2lzZSBpbnRlcmFjdGlvbnMgb25seSBpZiBib3RoIHByZWRpY3RvcnMgcHJlc2VudCBpbiB0aGUgbW9kZWwgYXMgbWFpbiBlZmZlY3RzLgogIG1ldGhvZCA9ICJnIiwgIyB0aGUgcHJvYmxlbSBpcyB0b28gbGFyZ2UgZm9yIGV4aGF1c3RpdmUgc2VhcmNoLCBzbyBzZWFyY2ggdXNpbmcgYSBnZW5ldGljIGFsZ29yaXRobQogIGNyaXQgPSBiaWMsICMgY3JpdGVyaWEgZm9yIG1vZGVsIHNlbGVjdGlvbiBpcyBCSUMgdmFsdWUgKGxvd2VyIGlzIGJldHRlcikKICBwbG90dHkgPSBGQUxTRSwgIyBkb24ndCBwbG90IG1vZGVscyBhcyBmdW5jdGlvbiBydW5zCiAgcmVwb3J0ID0gVFJVRSwgIyBkbyBwcm9kdWNlIHJlcG9ydHMgYXMgZnVuY3Rpb24gcnVucwogIGNvbmZzZXRzaXplID0gMTAsICMgcmV0dXJuIGJlc3QgMTAwIHNvbHV0aW9ucwogIGZpdGZ1bmN0aW9uID0gbG0gIyBmaXQgdXNpbmcgdGhlIGBsbWAgZnVuY3Rpb24KKQpgYGAKCg==